home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / compress / arj_992a.lzh / MODE_4.S < prev    next >
Text File  |  1994-08-07  |  4KB  |  119 lines

  1. ;
  2. ; ARJ mode4 decode function
  3. ; Size optimized
  4. ; (c) 1993 Mr Ni! (the Great) of the TOS-crew
  5. ;
  6. ; void decode_f(ulong origsize, char* depack_space, char* packed_data)
  7. ; CALL:
  8. ; D0 = origsize (long)
  9. ; A0 = ptr to depack space
  10. ; A1 = ptr to packed data
  11. ;
  12. ; Register usage:
  13. ; d0: temporary register
  14. ; d1: temporary register
  15. ; d2: temporary register, pointer offset
  16. ; d3: bytes to do counter
  17. ; d4: #bytes to copy
  18. ; d5: klad
  19. ; d6: bitbuf,subbitbuf
  20. ; d7: #bits in subbitbuf
  21. ; a0: depack space
  22. ; a1: rbuf_current
  23. ; a2: source adres for byte copy
  24. ; a3: temporary register
  25. ; a4: not used
  26. ; a5: not used
  27. ; a6: not used
  28. decode_f:
  29.      movem.l D3-D7/A2-A3,-(SP) ; save registers
  30.      move.l  D0,D3           ; origsize
  31.      moveq   #0,D7           ; bitcount = 0
  32.      move.w  A1,D0           ; for checking rbuf_current
  33.      btst    D7,D0           ; does readbuf_current point to an even address?
  34.      beq.s   .cont           ; yes
  35.      move.b  (A1)+,D6        ; pop eight  bits
  36.      moveq   #8,D7           ; 8 bits in subbitbuf
  37.      lsl.w   #8,D6           ;
  38. .cont:
  39.      moveq   #$10,D4         ; push 16 (8) bits into bitbuf
  40.      sub.w   D7,D4           ; subtract still available bits from  d5
  41.      lsl.l   D7,D6           ;
  42.      move.w  (A1)+,D6        ; word in subbitbuf
  43.      lsl.l   D4,D6           ; fill bitbuf
  44. .count_loop:                 ; main depack loop
  45.      move.l  D6,D1           ; evaluate most significant bit bitbuf
  46.      bmi.s   .start_sld      ; =1 -> sliding dictionary
  47.      moveq   #9,D0           ; pop bits from bitbuf for literal
  48.      bsr.s   .getbits        ;
  49.      move.b  D2,(A0)+        ; push byte in buffer
  50. .eval_loop:
  51.      subq.l  #1,D3           ;
  52.      bne.s   .count_loop     ;
  53.      movem.l (SP)+,D3-D7/A2-A3 ;
  54.      rts                     ;
  55.  
  56. .start_sld:                  ; start decode len
  57.      movea.w #8,A3           ;
  58.      moveq   #0,D2           ; max power
  59.      bsr.s   .get_them       ;
  60.      add.w   D2,D5           ; length
  61.      move.w  D5,D4           ;
  62.      move.l  D6,D1           ; bitbuf
  63.      subq.w  #3,A3           ; move.w  #5,a3
  64.      moveq   #9,D2           ; minimum getbits
  65.      bsr.s   .get_them       ;
  66.      ror.w   #7,D5           ;
  67.      addq.w  #1,D4           ; increment len by one
  68.      add.w   D5,D2           ; calc pointer
  69.      neg.w   D2              ; pointer offset negatief
  70.      lea     -1(A0,D2.w),A2  ; pointer in dictionary
  71.      sub.l   D4,D3           ; sub 'bytes to copy' from 'bytes to do' (d4 is 1 too less!)
  72. .copy_loop_0:
  73.      move.b  (A2)+,(A0)+     ;
  74.      dbra    D4,.copy_loop_0 ;
  75.      bra.s   .eval_loop      ;
  76.  
  77. .get_them:
  78.      moveq   #1,D0           ; minimum fillbits
  79.      moveq   #0,D5           ; value
  80. .loop:
  81.      add.l   D1,D1           ; shift bit outside
  82.      bcc.s   .einde          ; if '1' end decode
  83.      addx.w  D5,D5           ; value *2+1
  84.      addq.w  #1,D0           ; extra fill
  85.      addq.w  #1,D2           ; extra get
  86.      cmp.w   A3,D0           ; max bits
  87.      bne.s   .loop           ; nog mal
  88.      subq.w  #1,D0           ; 1 bit less to trash
  89. .einde:                      ;
  90.      bsr.s   .fillbits       ; trash bits
  91.      move.w  D2,D0           ; bits to get
  92.      bsr.s   .getbits        ; get bits
  93.      rts                     ;
  94.  
  95. .getbits:
  96.      move.l  D6,D2           ;
  97.      clr.w   D2              ;
  98.      rol.l   D0,D2           ;
  99. .fillbits:
  100.      sub.b   D0,D7           ; decrease subbitbuf count
  101.      bcs.s   .fill_subbitbuf ; not enough
  102.      rol.l   D0,D6           ; bits to pop from buffer
  103.      rts                     ;
  104.  
  105. .fill_subbitbuf:             ;
  106.      move.b  D7,D1           ;
  107.      add.b   D0,D1           ;
  108.      sub.b   D1,D0           ;
  109.      rol.l   D1,D6           ;
  110.      move.w  (A1)+,D6        ;
  111.      rol.l   D0,D6           ;
  112.      add.b   #16,D7          ; bits in subbitbuf
  113.      rts
  114.  
  115. ;d0,d1,d2,d3,d4,d5,d6,d7,a0,a1,a2,a3,a4,a5,a6,a7,sp
  116. ********************************************************************************
  117.  
  118.      END
  119.